#include <QTextCodec>
#include <QDebug>
#include <QSettings>
#include <QDialog>
#include <QColorDialog>
#include "rails.h"
#include "branch.h"
#include "types.h"
#include "optionwidget.h"

class QLabel;

//sprawdzam czy opcje sa ustawione, jezeli tak to inicjalizuję wartościami z opcji, jeżeli nie to wczytuję własne domyślne
// wywoływana jest funkcja setBranches podczas zmiany liczby numBranches oraz setRails podczas zmiany numRails.
void OptionWidget::setSettings()
{
    QSettings opcje("TabMar", "RoundaboutSimulator");//C:\settings
    ui->numBranchesSpinBox->setValue(opcje.value("numBranches", 2).toInt());
    ui->numRailsSpinBox->setValue(opcje.value("numRails", 0).toInt());
    _bgColor = opcje.value("bgColor").value<QColor>();
    ui->laneWidthSpinBox->setValue(opcje.value("laneWidth", 30).toInt());
    ui->radiusSpinBox->setValue(opcje.value("radius", 200).toInt());
    ui->rimNumLanesSpinBox->setValue(opcje.value("rimNumLanes", 3).toInt());

    //setBranches(_numBranches); - nie trzeba ustawiac, bo zmiana numBranchesSpinBox wywołuje te funkcje
    int size = opcje.beginReadArray("Branch");
    for (int i = 0; i < _numBranches; ++i)
    {
        opcje.setArrayIndex(i);
        wjazd[i]->setCurrentIndex(opcje.value("direction", 1).toInt());
        liczbaPasow[i]->setValue(opcje.value("numLanes", 3).toInt());
        zaleznosc[i]->setCurrentIndex(opcje.value("dependences", 1).toInt());;
    }
    opcje.endArray();
    //tory
    size = opcje.beginReadArray("Rails");
    for (int i = 0; i<size; i++)
    {
        opcje.setArrayIndex(i);
        torySkad[i]->setCurrentIndex(opcje.value("from", 0).toInt());
        toryDokad[i]->setCurrentIndex(opcje.value("to", 1).toInt());
        toryPodlozeSkad[i]->setCurrentIndex(opcje.value("fromRailBed", 0).toInt());
        toryPodlozeDokad[i]->setCurrentIndex(opcje.value("toRailBed", 0).toInt());
    }
    opcje.endArray();
}


//! saveSettings zapisuje potrzebne pola do opcji. Struktury są zapisywane w formie np. Branch/1/direction (numerowanie zaczyna się od 1).
//! Słowa kluczowe najlepiej widać w kodzie, choć nazwy są angielskie zgodne z polami klas. Zeby wyświetlic dostępne klucze mozna posłużyc sie funkcją
//! opcje.AllKeys(). Do zapisywania struktur wykorzystana jest funkcja beginWrireArray().
void OptionWidget::saveSettings()
{
    //tworze opcje    
    QSettings opcje("TabMar", "RoundaboutSimulator");//C:\settings
    //gałąź
    opcje.beginWriteArray("Branch");
    for (int i = 0; i<_numBranches; i++)
    {
        opcje.setArrayIndex(i);
        opcje.setValue("numLanes", liczbaPasow[i]->value() );
        opcje.setValue("direction", wjazd[i]->currentIndex());
        opcje.setValue("dependences", zaleznosc[i]->currentIndex());
    }
    opcje.endArray();
    //tory
    opcje.beginWriteArray("Rails");
    for (int i = 0; i < _numRails; i++)
    {
        opcje.setArrayIndex(i);
        opcje.setValue("from", torySkad[i]->currentIndex());
        opcje.setValue("to",  toryDokad[i]->currentIndex());
        opcje.setValue("fromRailBed", toryPodlozeSkad[i]->currentIndex());
        opcje.setValue("toRailBed", toryPodlozeDokad[i]->currentIndex());
    }
    opcje.endArray();
    //dodaje pola
    opcje.setValue("numBranches", _numBranches);
    opcje.setValue("numRails", _numRails);
    opcje.setValue("laneWidth", ui->laneWidthSpinBox->value());
    opcje.setValue("radius", ui->radiusSpinBox->value());
    opcje.setValue("rimNumLanes", ui->rimNumLanesSpinBox->value());
    opcje.setValue("bgColor", _bgColor);
    qDebug() << "settings saved";
    //BGCOLOR
}

void OptionWidget::changeBranchOptions(int numB)
{
    qDebug() <<"changeSettings: for ";
    //1 zapisuje bieżące opcje dróg
    QSettings opcjeTmp("TM", "tmp");
    opcjeTmp.beginWriteArray("Branch");
    for (int i = 0; i<_numBranches; i++)
    {
        opcjeTmp.setArrayIndex(i);
        opcjeTmp.setValue("numLanes", liczbaPasow[i]->value() );
        opcjeTmp.setValue("direction", wjazd[i]->currentIndex());
        opcjeTmp.setValue("dependences", zaleznosc[i]->currentIndex());
    }
    opcjeTmp.endArray();
    qDebug() <<"changeSettings: clearbranches() ";
    //2. czyszcze opcje
    clearBranches();
    //3.rysuje je na nowo
    qDebug() <<"changeSettings: setBranches ";
    setBranches(numB);
    //4. ustawiam settings zapisane wczesniej
    qDebug() <<"changeSettings: for ustawien ";
    int size = opcjeTmp.beginReadArray("Branch");
    if (size > numB) size = numB;
    for (int i = 0; i < size; ++i)
    {
        opcjeTmp.setArrayIndex(i);
        wjazd[i]->setCurrentIndex(opcjeTmp.value("direction", 1).toInt());
        liczbaPasow[i]->setValue(opcjeTmp.value("numLanes", 3).toInt());
        zaleznosc[i]->setCurrentIndex(opcjeTmp.value("dependences", 1).toInt());;
    }
    opcjeTmp.endArray();
    qDebug() <<"changeSettings: koniec ";
    
}

//dodanie wierza lub usunięcia przy torach. Ta funkcja ma zapisać te informacje, analogicznie jak changeBranchOptions
void OptionWidget::changeRailOptions(int numR)
{
    qDebug() <<"changeRailOptions: for ";
    //1 zapisuje bieżące opcje dróg
    QSettings opcjeTmp("TM", "tmp");
    opcjeTmp.beginWriteArray("Rails");
    for (int i = 0; i<_numRails; i++) //_numRails jest zerem na początku. dlaczego?
    {
        opcjeTmp.setArrayIndex(i);
        opcjeTmp.setValue("from", torySkad[i]->currentIndex());
        opcjeTmp.setValue("to",  toryDokad[i]->currentIndex());
        opcjeTmp.setValue("fromRailBed", toryPodlozeSkad[i]->currentIndex());
        opcjeTmp.setValue("toRailBed", toryPodlozeDokad[i]->currentIndex());
    }
    opcjeTmp.endArray();
    //2. czyszcze opcje
    clearRails();
    //3.rysuje je na nowo    
    setRails(numR);
    //4. ustawiam settings zapisane wczesniej
    qDebug() <<"changeRailOptions: for ustawien ";
    int size = opcjeTmp.beginReadArray("Rails");
    if (size > numR) size = numR;
    for (int i = 0; i < size; ++i)
    {
        opcjeTmp.setArrayIndex(i);
        if (torySkad[i]->count() <= opcjeTmp.value("from", 0).toInt())
            torySkad[i]->setCurrentIndex(torySkad[i]->count()-1);
        else
            torySkad[i]->setCurrentIndex(opcjeTmp.value("from", 0).toInt());
        if (toryDokad[i]->count() <= opcjeTmp.value("to", 0).toInt())
            toryDokad[i]->setCurrentIndex(torySkad[i]->count()-1);
        else
            toryDokad[i]->setCurrentIndex(opcjeTmp.value("to", 0).toInt());
        toryPodlozeSkad[i]->setCurrentIndex(opcjeTmp.value("fromRailBed", 0).toInt());
        toryPodlozeDokad[i]->setCurrentIndex(opcjeTmp.value("toRailBed", 0).toInt());
    }
    opcjeTmp.endArray();
    qDebug() <<"changeSettings: koniec ";
}
